//p1009

#include <iostream>
#include <vector>
using namespace std;

void sumfunc(int n);
vector<int> mul(int n);       // 计算n!（逆序存储）
vector<int> plu(vector<int> a, vector<int> b); // 高精度加法（逆序存储）
vector<int> trans(int n);     // 将整数转为逆序vector（个位在前）

int main() {
    int n; cin >> n;
    sumfunc(n);
    return 0;
}

void sumfunc(int n) {
    vector<int> ans;
    for (int i = 1; i <= n; ++i) {
        vector<int> fact = mul(i);  // 计算i!
        ans = plu(ans, fact);       // 累加阶乘之和
    }
    // 用反向迭代器输出（逆序存储转正常顺序）
    for (auto it = ans.rbegin(); it != ans.rend(); ++it) {
        cout << *it;
    }
    cout << endl;
}

// 高精度加法：a和b为逆序存储（个位在前），返回和的逆序存储
vector<int> plu(vector<int> a, vector<int> b) {
    vector<int> ans;
    int carry = 0;  // 进位
    auto it_a = a.begin();
    auto it_b = b.begin();

    // 遍历所有位，直到处理完所有数字和进位
    while (it_a != a.end() || it_b != b.end() || carry != 0) {
        int val_a = (it_a != a.end()) ? *it_a : 0;  // 越界则取0
        int val_b = (it_b != b.end()) ? *it_b : 0;
        int sum = val_a + val_b + carry;            // 加当前位和进位
        ans.push_back(sum % 10);                    // 存储当前位
        carry = sum / 10;                           // 更新进位
        // 移动迭代器
        if (it_a != a.end()) ++it_a;
        if (it_b != b.end()) ++it_b;
    }
    return ans;
}

// 计算n!（逆序存储）
vector<int> mul(int n) {
    if (n == 0 || n == 1) return {1};  // 0! = 1! = 1（逆序存储为[1]）
    vector<int> res = {1};  // 初始值为1（从1开始乘）
    for (int i = 2; i <= n; ++i) {  // 计算1×2×...×n
        int carry = 0;
        vector<int> temp;
        // 用当前res（逆序）乘以i
        for (int digit : res) {
            int product = digit * i + carry;
            temp.push_back(product % 10);  // 存储当前位
            carry = product / 10;          // 更新进位
        }
        // 处理剩余进位（可能多位）
        while (carry > 0) {
            temp.push_back(carry % 10);
            carry /= 10;
        }
        res = temp;  // 更新结果
    }
    return res;
}

// 将整数转为逆序vector（如123 → [3,2,1]）
vector<int> trans(int n) {
    if (n == 0) return {0};  // 特殊情况：0的逆序是[0]
    vector<int> ans;
    while (n > 0) {
        ans.push_back(n % 10);  // 取个位
        n /= 10;                // 移除个位
    }
    return ans;
}